"""
    @Author  ：思念 
    @File    ：6.线程安全.py
    @Date    ：2025/1/13 15:10 
"""

import threading

num = 0
#lock = threading.Lock()  # 互斥锁对象：被上锁的代码段，其他线程不能执行，直到当前线程解锁，不能重复上锁（效率更高）

lock = threading.RLock() # 递归锁对象：被上锁的代码段，其他线程不能执行，直到当前线程解锁，可以重复上锁


def add():
    global num
    for i in range(1000000):
        lock.acquire()
        num += i
        lock.release()


def sub():
    global num
    for i in range(1000000):
        lock.acquire()
        num -= i
        lock.release()


t1 = threading.Thread(target=add)
t2 = threading.Thread(target=sub)
t1.start()
t2.start()
t1.join()
t2.join()


print(f'主线程结果: ', num)



'''
    避免死锁的方案：
        1、线程锁对象全局为一个
        2、尽量使用递归锁
'''